package com.mxy.batterychargingreminding;

import android.app.ActivityManager;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Context;
import android.graphics.Color;
import android.os.Build;
import android.support.v4.app.NotificationCompat;
import android.util.Log;

import java.lang.reflect.Field;
import java.util.List;

/**
 * 工具类
 *
 * @author 马晓勇
 */

public final class Util {

    private Util() {
    }

    private static Boolean isdebug = null;

    /**
     * 高级别通知频道 通知灯+震动+提示音
     */
    private static NotificationChannel channelImportanceHigh;

    /**
     * 低级别通知频道 免打扰
     */
    private static NotificationChannel channelImportanceLow;

    /**
     * @param context 判断当前模式是debug还是release
     */
    public static void isDebugMode(Context context) {
        if (isdebug == null) {
            try {
                String packageName = context.getPackageName();
                Class buildConfig = Class.forName(packageName + ".BuildConfig");
                Field debug = buildConfig.getField("DEBUG");
                debug.setAccessible(true);
                isdebug = debug.getBoolean(null);
            } catch (Exception e) {
                isdebug = false;
                e.printStackTrace();
            }
        }
    }

    /**
     * @return 返回当前isdebug值
     */
    private static boolean isdebug() {
        return isdebug != null && isdebug;
    }

    /**
     * 打印debug信息到控制台
     * 一、Log.v 的调试颜色为黑色的，任何消息都会输出，这里的v代表verbose啰嗦的意思，平时使用就是Log.v("","");
     * 二、Log.d的输出颜色是蓝色的，仅输出debug调试的意思，但他会输出上层的信息，过滤起来可以通过DDMS的Logcat标签来选择
     * 三、Log.i的输出为绿色，一般提示性的消息information，它不会输出Log.v和Log.d的信息，但会显示i、w和e的信息
     * 四、Log.w的意思为橙色，可以看作为warning警告，一般需要我们注意优化Android代码，同时选择它后还会输出Log.e的信息。
     * 五、Log.e为红色，可以想到error错误，这里仅显示红色的错误信息，这些错误就需要我们认真的分析，查看栈的信息了。
     **/
    public static void print(String log) {
        if (isdebug()) {
            Log.i("info", log);
        }
    }

    /**
     * @param context
     * @param pid     进程id
     * @return 进程名
     */
    public static String getProcessName(Context context, int pid) {
        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);

        if (am != null) {
            List<ActivityManager.RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();
            if (runningApps == null) {
                return "123";
            }
            for (ActivityManager.RunningAppProcessInfo procInfo : runningApps) {
                if (procInfo.pid == pid) {
                    return procInfo.processName;
                }
            }
        }
        return "123";
    }


    /**
     * 创建NotificationChannel
     * 在Android 8.0以上版本中，桌面图标可以在有消息通知时出现一个小红点，用户可以长安图标，弹出消息提示
     *
     * @param context
     * @param channelId   频道ID
     * @param channelName 频道名称
     * @param importance  消息级别  true:高级(通知灯+震动+提示音)  false:低级(不打扰)
     */
    private synchronized static NotificationChannel createNotificationChannel(Context context,
                                                                              String channelId,
                                                                              String channelName,
                                                                              boolean importance) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            if (importance) {
                if (channelImportanceHigh != null) {
                    return channelImportanceHigh;
                }
            } else {
                if (channelImportanceLow != null) {
                    return channelImportanceLow;
                }
            }
            //高低频道都没有，创建并返回
            if (context != null) {
                NotificationChannel channel = new NotificationChannel(channelId, channelName,
                        importance ? NotificationManager.IMPORTANCE_HIGH :
                                NotificationManager.IMPORTANCE_LOW);
                //应用图标提示点颜色
                channel.setLightColor(Color.GREEN);
                //是否在久按桌面图标时显示此渠道的通知
                channel.setShowBadge(true);
                //是否允许震动
                channel.enableVibration(true);
                //是否允许控制手机通知灯
                channel.enableLights(true);
                //创建NotificationManager
                NotificationManager notificationManager =
                        (NotificationManager) context.getApplicationContext()
                                .getSystemService(Context.NOTIFICATION_SERVICE);

                notificationManager.createNotificationChannel(channel);
                if (importance) {
                    channelImportanceHigh = channel;
                } else {
                    channelImportanceLow = channel;
                }
                return channel;
            } else {
                return null;
            }
        } else {
            return null;
        }
    }

    /**
     * 通过Context获取NotificationBuilder
     *
     * @param context
     * @param channelId   频道ID
     * @param channelName 频道名称
     * @param importance  消息级别  true:高级(通知灯+震动+提示音)  false:低级(不打扰)
     * @return
     */
    public static NotificationCompat.Builder getNotificationBuilder(Context context,
                                                                    String channelId,
                                                                    String channelName,
                                                                    boolean importance) {
        if (context == null) {
            return null;
        } else {
            NotificationCompat.Builder builder;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                NotificationChannel notificationChannel = Util.createNotificationChannel(context,
                        channelId, channelName, importance);
                if (notificationChannel != null) {
                    builder = new NotificationCompat.Builder(context, notificationChannel.getId());
                } else {
                    builder = new NotificationCompat.Builder(context);
                }
            } else {
                builder = new NotificationCompat.Builder(context);
            }
            return builder;
        }
    }
}